perm filename NPROM.FAI[CMS,LCS]7 blob
sn#421079 filedate 1978-05-26 generic text, type T, neo UTF8
00100 COMMENT ⊗ VALID 00012 PAGES
00200 C REC PAGE DESCRIPTION
00300 C00001 00001
00400 C00002 00002 NEW MONITOR AND BOOTSTRAP PROM.
00500 C00003 00003 RESET
00600 C00005 00004 Disk load routine
00700 C00007 00005 START
00800 C00010 00006 Clear screen sub
00900 C00011 00007 Display DDT
01000 C00014 00008 CKCMD: CMPI "/" Examine
01100 C00015 00009 PRINT ADDRESS/VAL
01200 C00017 0000αiReset chr dpy
01300 C00019 00011 DISPLAY CHR
01400 C00021 00012 Paper tape loader Interupt driven?
01500 C00023 ENDMK
01600 C⊗;
00100 ; NEW MONITOR AND BOOTSTRAP PROM.
00200
00300 .INSERT ASMBL.FAI
00400
00500 ; ZPAGE RAM
00600
00700 TFLG: 0
00800 VAL: 0
00900 ADR: 0
01000 0
01100
01200 BLOCK 15 ;OLD DDT RAM
01300
01400 CUR: 0 ;Cursor
01500 0
01600 SD: 0 ;Screen edges
01700 ED: 0
01800
01900 RAS: 0 ;Dpy control defaults
02000 ROW: 0
02100 DPY: 0
02200 MIX: 0
02300
02400 BRCODE: 0 ;Default bit rate
02500 RSCODE: 0 ;Default acia control word
02600 KBCODE: 0 ;Default keyboard control word
00100 ;RESET
00200 LOC 177274 ;LOC 177000
00300 SRSTR←UNDEF ;System reset register
00400 RSTREG←UNDEF ;POWER ON RESET REG
00500
00600 PORCK: BIT RSTREG ;Check if power on reset
00700 BVS CKMODE
00800
00900 RST: LDXI 377 ;Stack depth
01000 TXS ;Set stack
01100 CLD ;Clear decimal mode
01200
01300 JSR CLRDPY ;Clear screen
01400 JSR SETVEC ;Setup default IRQ vectors
01500 JSR JMPSET ;Reset ram jumps
01600 ;Setup start addresses
01700
01800 ;CKMODE: PHA ;Save A??
01900 ;Reset system
02000 LDA RSTREG
02100 ANDI 60 ;RST mode bits
02200 BNE CKM1
02300 JMP OLDDDT ;Old DDT
02400 CKM1: CMPI 40
02500 BCS CKM2
02600 JMP LEDDDT ;KB LED DDT
02700 CKM2: BNE FBOOT
02800 JMP DPYDDT ;Display DDT
02900
03000 DSKSEL←176437;Floppy select
03100 FBAD←1400 ;Floppy bootstrap start address
03200 IBMR←163 ;IBM read command
03300
03400 FBOOT: LDAI RTI ;Dissable non maskable interupt
03500 STA NMIV
03600 JSR RESTOR ;Restore?
03700 ;Seek track
03800 BIT RSTREG ;Check if power on reset
03900 BVS NOPOR
04000 ;Wait for disk
04100
04200 NOPOR: LDAI 0 ;Floppy boot start addr. low
04300 STAZ FBADL
04400 LDAI 2 ;Fboot start addr. high
04500 STAZ FBADH
04600 LDXI 1 ;Number of sectors
04700 LDAI IBMR ;Read IBM sector
04800 STAZ FDC
04900
05000 JSR FLOAD ;Load from disk
05100 ;Check for error
05200
05300 JMP FBAD
00100 ;Disk load routine
00200 FDSKC←176420 ;DISK COMMAND REGISTER
00300 FDSKT←176421 ;DISK TRACK REGISTER
00400 FDSKS←176422 ;DISK SECTOR REGISTER
00500 FDSKD←176423 ;DISK DATA REGISTER
00600 FLOAD: LDAI 34 ;Reset disk servo
00700 STA DSKSEL
00800 LDAZ DSEL ;20 = Head unloaded and
00900 STA DSKSEL ;disk init disabled.
01000
01100 LDAZ SEC
01200 STA FDSKS ;Setup sector #
01300 ;Init data reg?
01400
01500 LDXI 2 ;Setup timer jump
01600 JLOOP: LDAX RJMP
01700 STAX NMIV
01800 DEX
01900 BPL JLOOP
02000
02100 LDAI UNDEF
02200 STA RTCAH ;Setup time out
02300 LDAI 17 ;17 = Load, /16, NMI, IEN
02400 STA RTCAC
02500
02600 LDAI 163 ;Read 1 IBM sector (128 bytes)
02700 STA FDSKC
02800
02900 LDYI 0
03000 DSKL: BIT DSKSEL
03100 BPL DSKL ;Wait until byte ready
03200 LDA FDSKD
03300 STAIY FBAD ;Load it
03400 INY
03500 BNE DSKL
03600
03700 LDAI 0
03800 RSTT: LDXI 0 ;Disable timer
03900 STA RTCAC
04000 ;Set / reset error bits
04100 RTS
04200
04300 RJMP: JMP FBTO
04400
04500 FBTO: PLA ;Flush stack
04600 PLA
04700 PLA
04800 LDAI TOBIT ;Set time out error bit
04900 JMP RSTT
00100 ;START
00200 BOOTS←1000 ;BOOTSTRAP START ADDRESS
00300 DMAINT:
00400 DSKINT:
00500 JMP BOOTS ;JUMP TO BOOT START
00600
00700 ;Reset ram jumps.
00800 JMPSET: LDXI UNDEF ;Number of jumps * 2
00900 JSET: LDAX JMPDEF
01000 STAZX RJMP ;Jump table setup loop
01100 DEX
01200 BPL JSET
01300 RTS
01400
01500 ;Default ram jumps
01600 JMPDEF:
01700
01800 ;Setup interrupt vectors.
01900 IVECT←176360 ;Ram interrupt vector table address
02000 SETVEC: LDXI 17 ;Number of vectors * 2
02100 IVSET: LDAX IVDEF ;Default vector setup loop
02200 STAX IVECT
02300 DEX
02400 BPL IVSET
02500
02600 PRIC←176436 ;PRI control register
02700 LDAI UNDEF ;Setup pri control register.
02800 STA PRIC
02900 RTS
03000
03100 ;Default interupt vectors.
03200 IVDEF: IVERR ;Error
03300 PROM
03400 IVERR ;Error
03500 PROM
03600 UNLOAD ;Disable head preload
03700 PROM
03800 MODINT ;TTY default
03900 PROM
04000 DMAINT ;Disk load and boot
04100 PROM
04200 DSKINT ;Disk load and boot
04300 PROM
00100 ;Clear screen sub
00200 CLRDPY: LDAI 0
00300 STAZ CUR
00400 LDAZ SD ;Get top of screen
00500 STAZ CUR+1
00600 LDYI 0
00700 LDAI " " ;<Space>
00800 CLRL: STAIY CUR
00900 INY
01000 BNE CLRL
01100 INCZ CUR+1
01200 LDXZ CUR+1
01300 CPXZ ED ;Bottom of screen
01400 BCC CLRL
01500 RTS
01600
01700 ;SETUP DMA
01800 FDMAA←176400 ;FDSK DMA ADDRESS REGISTER
01900 FDMAC←176401 ;FDSK COUNT REGISTER
02000 DMACON←176410;DMA COMMAND REGISTER
02100 LDAI 0 ;RESET DMA
02200 STA DMACON
02300 STA FDMAA ;SETUP DMA ADDRESS
02400 LDAI 2 ;1000
02500 STA FDMAA
02600 LDAI 377 ;SETUP DMA COUNT
02700 STA FDMAC
02800 LDAI 201 ;CNT=512-1
02900 STA FDMAC
03000 LDAI 141 ;ENABLE FDSK DMA
03100 IVERR ;Error
00100 ;Display DDT
00200 DPYDDT: LDAI 20 ;Unload disk head??
00300 STA DSKSEL
00400
00500 JSR RCDPY ;Setup display defaults
00600 ;Reset ACIA(S), BRG, MOD
00700 ;Setup KB chr map?
00800 DBRIN0: PHA
00900 LDAI RTI ;Disable NMI
01000 STA NMIV
01100 PLA
01200
01300 DBRIN1: JSR SVSTAT ;Save state?
01400
01500 JSR SETKB
01600 JSR SETDPY
01700 ;Init I/O?
01800 ;DPY DDT loop
01900 PCR: LDAI 15 ;PRINT <cr>.
02000 JSR RPCHR
02100 PLF: LDAI 12
02200 JSR RPCHR ;PRINT <cr>
02300 GNEXT: JSR RGCHR ;Wait for next chr
02400 ANDI 177
02500
02600 ;RAM JUMP
02700
02800 ECHO: JSR RPCHR ;Echo it
02900 CMPI 12 ;<lf>
03000 BEQ LF
03100 CMPI 60 ;Check for octal digit
03200 BCC CKCMD
03300 CMPI 70
03400 BCS CKCMD
03500
03600 ANDI 7
03700 LDXI 3
03800 SHFT: ASLZ TMP
03900 ROLZ TMP+1
04000 DEX
04100 BNE SHFT
04200
04300 ORAZ TMP
04400 STAZ TMP
04500 INCZ TFLG ;Set number flag
04600
04700 JMP GNEXT ;Wait for next chr
00100 CKCMD: CMPI "/" ;Examine
00200 BEQ SETAD
00300 CMPI UNDEF ;"↑"
00400 BEQ UPARO
00500 CMPI UNDEF ;<Tab>
00600 BEQ TAB
00700 CMPI UNDEF ;<Btab>
00800 BEQ BTAB
00900 CMPI UNDEF ;<Baddr>
01000 BEQ BADDR
01100 CMPI UNDEF ;<Jaddr>
01200 BEQ JADDR
01300 CMPI "P" ;Proceed
01400 BEQ GO
01500 CMPI "T" ;TTY
01600 BEQ TTY
01700 CMPI UNDEF ;TVT
01800 BEQ TVT
01900 CMPI "B" ;Modem boot
02000 BEQ MBOOT
02100 CMPI "L" ;Modem load
02200 BEQ MLOAD
02300 CMPI "U" ;Modem unload
02400 BEQ MUNLOD
02500
02600 ERROR: JMP GNEXT
00100 ;PRINT ADDRESS/VAL
00200 PAV: LDXI 0
00300 LDAI 1 ;# OF DIGITS
00400 STAZ NDIG
00500 STAZ TFLG ;SET BIT MASK
00600 LDYI 2 ;# OF BITS + C
00700 JSR RLOOP ;PRINT "0" OR "1"
00800 LDAI 5
00900 STAZ NDIG
01000 LDAI 7
01100 STAZ TFLG
01200 JSR CLOOP ;PRINT 5 OCTAL DIGITS
01300 LDAI "/"
01400 JSR PCHR ;PRINT "/"
01500 LDAI 1
01600 STAZ NDIG
01700 LDYI 3
01800 STYZ TFLG
01900 JSR DLOOP ;PRINT "0" - "3"
02000 LDAI 2
02100 STAZ NDIG
02200 LDAI 7
02300 STAZ TFLG
02400 JSR CLOOP ;PRINT 2 OCTAL DIGITS
02500 RTS
02600
02700 CLOOP: LDYI 3 ;FOR 3 BITS PER DIGIT
02800 RLOOP: ROLZ VAL ;ROTATE ADDRESS AND VALUE
02900 ROLZ ADR
03000 ROLZ ADR+1
03100 DLOOP: DEY
03200 BNE RLOOP
03300 LDAZ VAL ;GET NEXT DIGIT
03400 ANDZ TFLG
03500 ORAI 60 ;CONVERT TO ASCII
03600 JSR RPCHR ;PRINT IT (Ram jump)
03700 DECZ NDIG
03800 BNE CLOOP ;NEXT DIGIT
03900 RTS
00100 ;Reset chr dpy
00200 RCDPY: LDAI 0 ;Reset cursor
00300 STAZ CUR
00400 LDAI DPYRAM
00500 STAZ CUR+1
00600
00700 RASTER←171760;RASTER OFFSET
00800 CHRROW←171761;CHR ROW OFFSET
00900 DPYC←171764 ;VIDIO CONTROL
01000 VMIX←171765 ;VIDIO MIXER
01100 LDAI 14 ;SET UP DPY DEFAULTS
01200 STAZ RAS ;SHOULD BE 0,0
01300 LDAI 377
01400 STAZ ROW
01500 LDAI 100 ;CURSOR ENABLE
01600 STAZ DPY
01700 LDAI 1 ;NORMAL MIX
01800 STAZ MIX
01900
02000 ;Setup screen edges
02100 LDAI 200
02200 STAZ SD ;Upper edge
02300 LDAI 210
02400 STAZ ED ;lower edge
02500
02600 ;Reset key board defaults
02700 KBD←173370 ;KB DATA REGISTER
02800 KBC←173371 ;KB CONTROL REGISTER
02900 LDAI UNDEF ;RESET KB DEFAULT
03000 STAZ KBCODE
03100
03200 RTS
03300
03400 ;Reset brate and acia defaults
03500 RSDEF←25 ;ACIA CONTROL DEFAULT
03600 RMOD: LDAI 15 ;Set bit rate to 300
03700 STAZ BRCODE
03800 LDAI RSDEF ;SETUP ACIA DEFAULT
03900 STAZ RSCODE
04000
04100 LDAI 3
04200 STA ACIAC ;Reset ACIA?
04300
04400 RTS
00100 ;DISPLAY CHR
00200 PDPY: LDYI 0 ;?
00300 STAIY CUR ;WRITE CHR INTO CHRDPY MEM
00400
00500 INCZ CUR ;INCREMENT CURSOR
00600 LDAZ CUR
00700 ANDI 77 ;CHECK IF OFF RIGHT EDGE
00800 BEQ CRLF ;CLEAR NEXT LINE
00900
01000 CURREG←171762 ;CURSOR CONTROL REGISTERS
01100 UPCUR: LDAZ CUR ;UPDATE CURSOR
01200 STA CURREG
01300 LDAZ CUR+1
01400 STA CURREG+1
01500 RTS
01600
01700 CRLF: LDAZ CUR ;FIX CURSOR
01800 SEC
01900 SBCI 100 ;Chr per line
02000 STAZ CUR ;Fall through to line feed
02100
02200 ;LINE FEED
02300 LF: CLC
02400 LDAZ CUR
02500 ADCI 100 ;NEXT LINE
02600 STAZ CUR
02700 BCC NOTOFF
02800 INCZ CUR+1
02900 LDAZ CUR+1
03000 CMPZ ED ;BOTTOM OF SCREEN
03100 BEQ GLITCH
03200 ;Clear to end of line sub
03300 CTEOL: LDAZ CUR
03400 ANDI 77
03500 EORI 77
03600 TAY
03700 LDAI 40 ;<space>
03800 CLR: STAIY CUR
03900 DEY
04000 BNE CLR
04100 RTS
04200
04300 GLITCH:
04400 RTS
00100 ;Paper tape loader Interupt driven?
00200 PTLOAD:
00300 PTW1: BIT CRB0 ;Wait for chr
00400 BPL PTW1
00500 LDA PRA0 ;Get chr
00600 CMPI UNDEF
00700 BEQ PTW1 ;Check if record mark
00800
00900 ;Intel hex, PDP-11 bin, or ? (cksum, etc.)
01000
01100
01200 ;Prom reset and interupt vectors
01300 LOC 200266 ;LOC 177772
01400
01500 NMIV: NMIINT ;Prom Non maskable interupt vector
01600 PROM
01700
01800 RSTV: RST ;Prom reset vector
01900 PROM
02000
02100 ;Prom interupt request vector
02200 IRQV: 0 ;0 for PIV enable
02300 0
02400 END